数据模型与租户隔离
租户 = 应用(appid)
所有业务表都带 appid 列,作为第一隔离维度。你的应用永远只能读写自己的数据,跨应用访问返回 404/403。
通用列
业务表遵循通用约定:
| 列 | 说明 | ||
|---|---|---|---|
id | UUIDv7(全局唯一、可排序) | ||
appid | 租户标识 | ||
created_at / updated_at | ISO 8601(UTC) | ||
deleted_at | 软删除标记 | ||
version | 乐观锁版本号 | ||
created_by / updated_by | 操作者 |
乐观锁
写操作要求携带 version:
PATCH /content/v1/contents/{id} body: { ..., "version": 7 }
服务端执行 UPDATE ... WHERE id=? AND version=7,不匹配则返回 409 VERSION_CONFLICT。每次成功写操作 version+1。
审计日志
每个平台有 *_audit_log 表,记录所有状态迁移与写操作(actor、action、changes、request_id、ip),保留 ≥ 180 天,支持游标分页查询。
事件
关键业务状态变化发事件(如 content.published、order.paid),事件载荷含 appid,订阅方按租户过滤。
多语言数据
- 内容:
contents.lang字段(BCP-47),同一内容不同语言建议各建一条,用meta_json.variant_ids关联; - 名称类字段:
name_json/description_json(JSON:{en, cn, tw, jp, de, fr, es, ar}); - 语言包:i18n 平台统一管理,应用前端按
lang参数取词。